From 109ae2e9b41456f29ed3e0ca929db525a5842087 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Mon, 12 Dec 2016 09:39:26 +0100 Subject: [PATCH] x86emul: abstract gcc asm() flag output handling Let's try to limit #ifdef-ery, or else more of these would need to appear later. Signed-off-by: Jan Beulich Reviewed-by: Andrew Cooper --- xen/arch/x86/x86_emulate/x86_emulate.c | 49 +++++++++----------------- 1 file changed, 16 insertions(+), 33 deletions(-) diff --git a/xen/arch/x86/x86_emulate/x86_emulate.c b/xen/arch/x86/x86_emulate/x86_emulate.c index 388911edc7..3ab5eaa84d 100644 --- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -404,6 +404,12 @@ typedef union { (void *)((long)(__##var + __alignof(type) - __alignof(long)) \ & -__alignof(type)) +#ifdef __GCC_ASM_FLAG_OUTPUTS__ +# define ASM_FLAG_OUT(yes, no) yes +#else +# define ASM_FLAG_OUT(yes, no) no +#endif + /* MSRs. */ #define MSR_TSC 0x00000010 #define MSR_SYSENTER_CS 0x00000174 @@ -694,11 +700,8 @@ static inline int mkec(uint8_t e, int32_t ec, ...) */ static bool even_parity(uint8_t v) { -#ifdef __GCC_ASM_FLAG_OUTPUTS__ - asm ( "test %1,%1" : "=@ccp" (v) : "q" (v) ); -#else - asm ( "test %1,%1; setp %0" : "=qm" (v) : "q" (v) ); -#endif + asm ( "test %1,%1" ASM_FLAG_OUT(, "; setp %0") + : ASM_FLAG_OUT("=@ccp", "=qm") (v) : "q" (v) ); return v; } @@ -998,12 +1001,8 @@ static bool mul_dbl(unsigned long m[2]) { bool rc; -#ifdef __GCC_ASM_FLAG_OUTPUTS__ - asm ( "mul %1" : "+a" (m[0]), "+d" (m[1]), "=@cco" (rc) ); -#else - asm ( "mul %1; seto %2" - : "+a" (m[0]), "+d" (m[1]), "=qm" (rc) ); -#endif + asm ( "mul %1" ASM_FLAG_OUT(, "; seto %2") + : "+a" (m[0]), "+d" (m[1]), ASM_FLAG_OUT("=@cco", "=qm") (rc) ); return rc; } @@ -1017,12 +1016,8 @@ static bool imul_dbl(unsigned long m[2]) { bool rc; -#ifdef __GCC_ASM_FLAG_OUTPUTS__ - asm ( "imul %1" : "+a" (m[0]), "+d" (m[1]), "=@cco" (rc) ); -#else - asm ( "imul %1; seto %2" - : "+a" (m[0]), "+d" (m[1]), "=qm" (rc) ); -#endif + asm ( "imul %1" ASM_FLAG_OUT(, "; seto %2") + : "+a" (m[0]), "+d" (m[1]), ASM_FLAG_OUT("=@cco", "=qm") (rc) ); return rc; } @@ -5194,15 +5189,9 @@ x86_emulate( { bool zf; -#ifdef __GCC_ASM_FLAG_OUTPUTS__ - asm ( "bsf %2,%0" - : "=r" (dst.val), "=@ccz" (zf) - : "rm" (src.val) ); -#else - asm ( "bsf %2,%0; setz %1" - : "=r" (dst.val), "=qm" (zf) + asm ( "bsf %2,%0" ASM_FLAG_OUT(, "; setz %1") + : "=r" (dst.val), ASM_FLAG_OUT("=@ccz", "=qm") (zf) : "rm" (src.val) ); -#endif _regs.eflags &= ~EFLG_ZF; if ( (vex.pfx == vex_f3) && vcpu_has_bmi1() ) { @@ -5227,15 +5216,9 @@ x86_emulate( { bool zf; -#ifdef __GCC_ASM_FLAG_OUTPUTS__ - asm ( "bsr %2,%0" - : "=r" (dst.val), "=@ccz" (zf) + asm ( "bsr %2,%0" ASM_FLAG_OUT(, "; setz %1") + : "=r" (dst.val), ASM_FLAG_OUT("=@ccz", "=qm") (zf) : "rm" (src.val) ); -#else - asm ( "bsr %2,%0; setz %1" - : "=r" (dst.val), "=qm" (zf) - : "rm" (src.val) ); -#endif _regs.eflags &= ~EFLG_ZF; if ( (vex.pfx == vex_f3) && vcpu_has_lzcnt() ) { -- 2.30.2